#===============================================================================
# Koro Business Environment
# Copyright (C) 2008  Antonio Corroppoli
#
#This file is part of Koro BE.
# 
# Koro BE is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# Koro BE is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with Koro BE; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#===============================================================================

'''
Created on 16/ago/2011

@author: antstud
'''

from koro.core.context import Context
from koro.db import database
from koro.modules.prodotti.model import Prodotto
from koro.modules.magazzino import model


class MagazzinoContext(Context):
    @staticmethod
    def _movimenta(documento,tipo_movimento):
        data_mov=documento.get_data_documento()
        for riga in documento.dettaglio:
            if not riga.da_movimentare():
                continue
            movimento=model.MovimentoMagazzino(data_mov)
#            tipo=database.get_instance().query(TipoMovimento).\
#            filter_by(ID=self.id_tipo_mov).first()
            movimento.tipo_movimento=tipo_movimento
            #mm.set_tipo_movimento(tipo)
            movimento.set_prodotto(riga.prodotto)
            movimento.set_quantita(riga.get_quantita())
            movimento.set_documento(documento)   
            movimento.set_segno(model.TipoMovimento.segno(tipo_movimento))     
            database.get_instance().add(movimento)
        database.get_instance().commit()
    
    @staticmethod
    def carica(documento):
        MagazzinoContext._movimenta(documento, model.TipoMovimento.CARICO)
    
    @staticmethod
    def scarica(documento):
        MagazzinoContext._movimenta(documento, model.TipoMovimento.SCARICO)
    
    @staticmethod
    def _aggiorna_magazzino(documento,tipo_movimento):
        MagazzinoContext.cancella_movimenti(documento)
        MagazzinoContext._movimenta(documento, tipo_movimento)        
    
    @staticmethod
    def cancella_movimenti(documento):
        database.get_instance().query(model.MovimentoMagazzino).\
        filter_by(fk_documento=documento.ID).delete()
        database.get_instance().commit()
    
    @staticmethod
    def aggiorna_carico(documento):
        return MagazzinoContext._aggiorna_magazzino(documento, model.TipoMovimento.CARICO)
    
    @staticmethod
    def aggiorna_scarico(documento):
        return MagazzinoContext._aggiorna_magazzino(documento, model.TipoMovimento.SCARICO)


#===============================================================================
# MovimentiContext
#===============================================================================
class MovimentiContext(Context):
    def __init__(self):
        Context.__init__(self,model.MovimentoMagazzino)

    def new_object(self):
        return model.MovimentoMagazzino()
        
#    def get_tipi_movimento(self):
#        return database.get_instance().load(model.TipoMovimento)
#    
#    def get_tipo_movimento(self,*args,**kwargs):
#        query=database.get_instance().query(model.TipoMovimento)
#        if len(kwargs)>0:
#            query=query.filter_by(**kwargs)
#        if len(args)>0:
#            for a in args:
#                query=query.filter(a)
#        return query.first()
#        if len(obj_list)==0:
#            return None
#        return obj_list[0]
    
    
#===============================================================================
# InventarioContext
#===============================================================================
class InventarioContext(Context):
    def __init__(self):
        Context.__init__(self)
    
    def get_objects(self,*args,**kwargs):
        query=database.get_instance().query(Prodotto)
        if len(kwargs)>0:
            query=query.filter_by(**kwargs)
        if len(args)>0:
            for a in args:
                query=query.filter(a)
        prodotti=query.all()
        for prodotto in prodotti:#eliminare
            setattr(prodotto,'giacenza',self._get_giacenza(prodotto.ID))
        return prodotti
        
    def _get_giacenza(self,id_prodotto):#eliminare
        query=database.get_instance().query("giacenza")
        statement='select sum(quantita*segno) as giacenza\
        from movimenti_magazzino \
        where fk_prodotto={0}'.format(id_prodotto)
        query=query.from_statement(statement)
        giacenza=query.scalar()
        if giacenza is None:
            return 0
        return giacenza
    
    def save_object(self,obj):
        raise Exception('Metodo non disponibile.')
    
    def delete_object(self,obj):
        raise Exception('Metodo non disponibile.')
    
    def new_object(self):
        raise Exception('Metodo non disponibile.')
    
    def update_object(self,obj):
        raise Exception('Metodo non disponibile.')